/*
 * AudioEncoder.h
 *
 *  Created on: 2015年12月31日
 *      Author: terry
 */

#ifndef AUDIOENCODER_H_
#define AUDIOENCODER_H_

#include "MediaEncoder.h"
#include "AVFramePtr.h"
#include "Ffmpeg.h"

extern "C"
{
    #include "libswresample/swresample.h"
    #include "libavutil/audio_fifo.h"
}

namespace av
{

class AudioEncoder: public MediaEncoder
{
public:
	AudioEncoder();
	virtual ~AudioEncoder();

	virtual int open(const MediaProfile& profile);

	virtual void close();

	virtual bool isOpen();

	virtual int encode(AVFrame* frame, AVPacket* pkt);

	virtual void flush();

	virtual bool getMediaFormat(MediaFormat& fmt);

	virtual bool getInputFormat(int& pixelFormat, int& sampleFormat);

	virtual void enableAccel(bool enabled);

	virtual bool setParam(const std::string& name, const char* value);

protected:
	int openEncoder(const MediaProfile& profile);
	void closeEncoder();
	bool isEncoderOpen();

	bool isSamleFormat(int fmt, int channels, int sampleRate);

	bool getAudioConfig(std::string& config);

	int resample(AVFrame* inFrame, AVFrame* outFrame);


	void storeFrame(AVFrame* frame);
	bool loadFrame(AVFrame* frame, int nb_samples);
	void closeFifo();
	int getFifoSize();

	int doEncode(AVPacket* pkt);

protected:
	MediaProfile	m_profile;
	AVCodecContext* m_context;
	SwrContext*		m_swrContext;
	AVAudioFifo*	m_fifo;
    int64_t         m_sampleCount;
    std::string     m_extradata;

};

} /* namespace av */

#endif /* AUDIOENCODER_H_ */
